#!/usr/bin/env bash
cd $(dirname $0)

main(){
    #LsFileType sh fish 
    DirMenuMain2
    #AutoMenu 
}

#------------------------------
#自动菜单，包含所有文件夹和文件，
#按优先级决定执行
#------------------------------
function AutoMenu(){
    echo " "
    echo "++++++++++++++++++ $(basename $PWD) ++++++++++++++++++"
    local m=$(ls) 
    #未检测到目标自动执行当前路径下的run脚本
    if [ ${#m} -eq 0 ] || [ -f run ] || [ -f run.sh ] || [ -f run.fish ];then 
        ExecRun
        exit 0
    fi
    echo "0.退出"
    DisplayList $m
    echo "" && read -p "输入对应菜单的序号：" key
    if [ $(IsNumber $key) -eq 0 ] ; then 
        test $key -eq 0 && exit 0
        local src=$(echo $m |xargs -n1|sed -n ''$key'p') #获取指定编号的内容
        if [ -d $src ] ;then
            cd $src 
            AutoMenu
        elif [ -f $src ] ;then
            echo ">自动执行$src文件"
            ReadFileTypeAndAutoRun $src
            exit 0
        fi  
        
    else
        echo "输入的不是数字！"
    fi    
}
#------------------------------
#以文件夹名称作为菜单名，文件夹下存在
#run/run.sh文件就执行该文件，否则列
#出该目录下的文件夹名称作为菜单名
#------------------------------
function DirMenuMain(){
    echo " "
    echo "++++++++++++++++++ $(basename $PWD) ++++++++++++++++++"
    local m=$(LsDir) 
    #当前路径下没有下一级目录或者当前目录下存在 run/run.sh/run.fish脚本则自动执行脚本
    if [ ${#m} -eq 0 ] || [ -f run ] || [ -f run.sh ] || [ -f run.fish ];then 
        ExecRun
        exit 0
    fi
    echo "0.退出"
    DisplayList $m
    echo "" && read -p "输入对应菜单的序号：" key
    if [ $(IsNumber $key) -eq 0 ] ; then 
        test $key -eq 0 && exit 0
        local src=$(echo $m |xargs -n1|sed -n ''$key'p') #获取指定编号的内容
        cd $src
        DirMenuMain

    else
        echo "输入的不是数字！"
    fi 
}


#------------------------------
#以文件夹名称作为菜单名，文件夹下存在
#run/run.sh文件就执行该文件，否则列
#出该目录下的文件夹名称作为菜单名
#使用select实现
#------------------------------
function DirMenuMain2(){
    echo " "
    echo "++++++++++++++++++ $(basename $PWD) ++++++++++++++++++"
    local m=$(LsDir) 
    #当前路径下没有下一级目录或者当前目录下存在 run/run.sh/run.fish脚本则自动执行脚本
    if [ ${#m} -eq 0 ] || [ -f run ] || [ -f run.sh ] || [ -f run.fish ];then 
        ExecRun
        exit 0
    fi

    PS3="输入对应菜单的编号:"
    select i in $m quit 
    do 
        if [[ "$i" == "quit" ]] ; then 
            break
        else    
            #echo $i 
            if [ -d $i ] ; then 
                cd $i 
                DirMenuMain2
                break 
            fi 
        fi 
    done 

}
#------------------------------
#为输入的对象添加索引并显示,索引从1
#开始
#@param:输入的资源
#------------------------------
function DisplayList(){
    local idx=1
    for i in $* 
    do
        echo "$idx.${i%.*}"
        idx=$[idx+1]
    done 
}
#------------------------------
#列出当前目录下的所有目录
#------------------------------
function LsDir()
{
    for i in $(ls)
    do
        test -d $i && echo $i 
    done 
}

#------------------------------
#自动执行当前路径下的特定脚本
#按优先级：
#1. run
#2. run.sh
#3. run.fish
#------------------------------
function ExecRun(){
    echo "当前路径为:$PWD"
    if [ -f run ] ;then
        echo ">存在run文件，执行run脚本"
        chmod +x run 
        ./run $*
    elif [ -f run.sh ]; then
        echo ">存在run.sh文件，执行run.sh脚本"
        chmod +x run.sh 
        ./run.sh $*
    elif [ -f run.fish ]; then
        echo ">存在run.fish文件，执行run.fish脚本"
        chmod +x run.sh 
        ./run.sh $*
    else
        echo "不存在run或者run.sh脚本"
    fi 
}

#------------------------------
#列出当前目录下的所有目录,最前面
#添加序号
#------------------------------
function LsDirAddIndex()
{
    local idx=1
    local arr=''
    for i in $(ls)
    do
        test -d $i && echo "$idx:$i" && idx=$[idx+1]
    done 

}
#------------------------------
#判断字符串是否为数字
#@return   0：是  1：不是
#------------------------------
function IsNumber(){
    local y=$(echo "$1" | sed 's/[0-9]//g')
    if [ -z "$y" ];then
        echo 0 #是数字 
    else
        echo 1 #"不是数字"
    fi
}

#------------------------------
#文件类型筛选
#列出当前目录下所有满足指定后缀的
#文件
#@param：文件后缀
#例如：LsFileType sh fish plt
#------------------------------
function LsFileType(){
    local src=""
    for i in $*
    do  
        find .  -maxdepth 1 -type f -name "*.$i"
    done 
}

#-----------------------------------------
#函数名：ReadIni 
#功能：读取ini文件
#@param1：ini文件路径
#@param2：Section
#@param3：Option
#例如：ReadIni test.ini s2 Path 
#-----------------------------------------
function ReadIni(){
    fid=$1
    section=$2
    option=$3

    test ! -f $fid && echo "不存在文件$fid" && exit 2
    if [ $# -eq 3 ] ; then
        cat $fid | awk '/\['$section'\]/{f=1;next} /\[*\]/{f=0} f' |  #找出section下的所有内容
        grep $option | # 匹配option的行 
        grep '='     | # 看看是不是存在=
        cut -d'=' -f2| # 获取对应的值
        cut -d'#' -f1| # 去除注释
        cut -d';' -f1| #去除注释
        awk '{gsub(/^\s+|\s+$/, "");print}' #去掉最前面的空格
    fi 
}

#------------------------------
#自动根据文件后缀选择执行方式
#@param1:指定的文件
#------------------------------
function ReadFileTypeAndAutoRun(){ 
    test ! -f $1 && echo "不存在$1文件" && exit 2
    local srcpath=$(readlink -f $1)
    cd $(dirname $srcpath)
    local dst=$(date +%Y%m%d%H%M%S.mgo) #临时文件
    chmod +x $(basename $srcpath)
    case $1 in 
        *.sh | *.fish | *.pl | *.tcl | *.tk | *.py | *.lua)  chmod +x $1 && ./$1 ;; 
        *.c) gcc -o $dst $1 && chmod +x $dst && ./$dst;;
        *.cpp) g++ -std=c++11 -o $dst $1 && chmod +x $dst && ./$dst;;
        *.go ) go build -o $dst $1 && chmod +x $dst &&  ./$dst ;;
        *.plt) gnuplot $1 ;;   #gnuplot
        * ) echo "Fuck! I don't konw what it is!" ;;
    esac

    test -f $dst && rm $dst &>/dev/null
}



main $* 
